#include <iostream>
#include <vector>
#include <string>
#include <memory>

// 抽象迭代器接口
class Iterator {
public:
    virtual void first() = 0;                  // 将迭代器移动到第一个元素
    virtual void next() = 0;                   // 移动到下一个元素
    virtual bool isDone() const = 0;           // 检查是否已到达集合末尾
    virtual std::string currentItem() const = 0; // 获取当前元素
    virtual ~Iterator() = default;
};

// 抽象集合接口
class Aggregate {
public:
    virtual std::shared_ptr<Iterator> createIterator() = 0; // 创建迭代器
    virtual ~Aggregate() = default;
};

// 具体集合类：书籍集合
class BookCollection : public Aggregate {
private:
    std::vector<std::string> books; // 用于存储书籍的集合

public:
    // 添加书籍
    void addBook(const std::string& book) {
        books.push_back(book);
    }

    // 获取书籍总数
    size_t getSize() const {
        return books.size();
    }

    // 根据索引获取书籍
    std::string getBook(size_t index) const {
        if (index < books.size()) {
            return books[index];
        }
        return "";
    }

    // 实现创建迭代器的方法
    std::shared_ptr<Iterator> createIterator() override;

    // 声明迭代器为友元类，方便访问私有数据
    friend class BookIterator;
};

// 具体迭代器类：书籍迭代器
class BookIterator : public Iterator {
private:
    const BookCollection& collection; // 引用书籍集合
    size_t currentIndex;              // 当前迭代器位置

public:
    // 构造函数
    BookIterator(const BookCollection& collection) 
        : collection(collection), currentIndex(0) {}

    // 实现迭代器接口方法
    void first() override {
        currentIndex = 0; // 移动到第一个元素
    }

    void next() override {
        if (currentIndex < collection.getSize()) {
            ++currentIndex; // 移动到下一个元素
        }
    }

    bool isDone() const override {
        return currentIndex >= collection.getSize(); // 检查是否到达集合末尾
    }

    std::string currentItem() const override {
        if (!isDone()) {
            return collection.getBook(currentIndex); // 返回当前书籍
        }
        return "无效的书籍"; // 如果越界，返回无效
    }
};

// 在BookCollection中实现创建迭代器的方法
std::shared_ptr<Iterator> BookCollection::createIterator() {
    return std::make_shared<BookIterator>(*this);
}

// 客户端代码
int main() {
    // 创建一个书籍集合
    BookCollection library;
    library.addBook("C++编程入门");
    library.addBook("设计模式详解");
    library.addBook("数据结构与算法");
    library.addBook("操作系统原理");

    // 创建迭代器
    auto iterator = library.createIterator();

    // 使用迭代器访问集合中的元素
    std::cout << "图书馆中的书籍列表：" << std::endl;
    for (iterator->first(); !iterator->isDone(); iterator->next()) {
        std::cout << " - " << iterator->currentItem() << std::endl;
    }

    return 0;
}
